// 01_variables_and_data_types.rs
// Rust 变量和数据类型教程

fn main() {
    // 1. 变量声明
    // 使用 let 关键字声明变量
    let x = 5;  // 不可变变量
    println!("x 的值是: {}", x);
    
    // 可变变量需要使用 mut 关键字
    let mut y = 10;
    println!("y 的值是: {}", y);
    y = 15;  // 修改可变变量
    println!("修改后 y 的值是: {}", y);
    
    // 变量遮蔽 (Shadowing)
    let z = 20;
    println!("z 的值是: {}", z);
    let z = z + 1;  // 同名变量遮蔽之前的变量
    println!("遮蔽后 z 的值是: {}", z);
    let z = "现在 z 是字符串";  // 类型也可以改变
    println!("再次遮蔽后 z 的值是: {}", z);
    
    // 2. 基本数据类型
    // 整数类型
    let a: i32 = 10;  // 32 位有符号整数
    let b: u64 = 20;  // 64 位无符号整数
    println!("a = {}, b = {}", a, b);
    
    // 浮点数类型
    let c: f32 = 3.14;  // 32 位浮点数
    let d: f64 = 2.71828;  // 64 位浮点数
    println!("c = {}, d = {}", c, d);
    
    // 布尔类型
    let e: bool = true;
    let f: bool = false;
    println!("e = {}, f = {}", e, f);
    
    // 字符类型
    let g: char = 'R';
    let h: char = '锈';
    println!("g = {}, h = {}", g, h);
    
    // 3. 复合类型
    // 元组 (Tuple)
    let tup: (i32, f64, char) = (100, 3.14, 'R');
    println!("元组 tup = {:?}", tup);
    
    // 访问元组元素
    let (x, y, z) = tup;
    println!("解构元组: x = {}, y = {}, z = {}", x, y, z);
    
    // 通过索引访问元组元素
    println!("tup.0 = {}, tup.1 = {}, tup.2 = {}", tup.0, tup.1, tup.2);
    
    // 数组 (Array)
    let arr: [i32; 5] = [1, 2, 3, 4, 5];  // [类型; 长度]
    println!("数组 arr = {:?}", arr);
    println!("数组 arr = {:#?}", arr);
    
    // 访问数组元素
    println!("arr[0] = {}", arr[0]);
    
    // 创建包含相同值的数组
    let same_values = [3; 5];  // 包含 5 个 3 的数组
    println!("相同值的数组 same_values = {:?}", same_values);
    
    // 4. 类型注解和推断
    let without_annotation = 42;  // Rust 会自动推断为 i32
    let with_annotation: u32 = 42;  // 显式指定类型
    
    println!("without_annotation = {}, with_annotation = {}", without_annotation, with_annotation);
    
    // 5. 数字字面量
    let decimal = 98_222;  // 十进制，下划线用于可读性
    let hex = 0xff;        // 十六进制
    let octal = 0o77;      // 八进制
    let binary = 0b1111_0000;  // 二进制
    let byte = b'A';       // 字节 (仅限 u8)
    
    println!("decimal = {}, hex = {}, octal = {}, binary = {}, byte = {}", 
             decimal, hex, octal, binary, byte);
    
    // 6. 浮点数运算
    let sum = 5 + 10;
    let difference = 95.5 - 4.3;
    let product = 4 * 30;
    let quotient = 56.7 / 32.2;
    let remainder = 43 % 5;
    
    println!("sum = {}, difference = {}, product = {}, quotient = {}, remainder = {}", 
             sum, difference, product, quotient, remainder);
}